package com.bawei.solr;

import java.io.IOException;

import org.apache.lucene.analysis.*;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.*;
import org.apache.lucene.search.*;
import org.apache.lucene.store.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 
 * 通过该类了解 lucene 的核心类
 *
 */
public class LuceneTest {

	private static final Logger LOGGER = LoggerFactory
			.getLogger(LuceneTest.class);

	public static void main(String[] args) {

		// Analyzer是分词器接口，文本文件在被索引之前，需要经过Analyzer处理。常用的中文分词器有庖丁、IKAnalyzer等
		Analyzer analyzer = new StandardAnalyzer();

		// Directory类描述了Lucene索引的存放位置
		Directory directory = new RAMDirectory();

		// 如下想把索引存储到硬盘上，使用下面的代码代替
		// Directory directory = FSDirectory.open(Paths.get("/tmp/testindex"));

		IndexWriterConfig config = new IndexWriterConfig(analyzer);

		// IndexWriter是索引过程的核心组件。用于创建一个新的索引并把文档加到已有的索引中去，也可以向索引中添加、删除和更新被索引文档的信息
		IndexWriter writer = null;
		try {
			writer = new IndexWriter(directory, config);

			String[] texts = new String[] { "Mybatis分页插件 - 示例",
					"Mybatis 贴吧问答 第一期", "Mybatis 示例之 复杂(complex)属性(property)",
					"Mybatis极其(最)简(好)单(用)的一个分页插件",
					"Mybatis 的Log4j日志输出问题 - 以及有关日志的所有问题",
					"Mybatis 示例之 foreach (下)", "Mybatis 示例之 foreach (上)",
					"Mybatis 示例之 SelectKey", "Mybatis 示例之 Association (2)",
					"Mybatis 示例之 Association" };

			for (String text : texts) {
				// Document对象代表一组域（Field）的集合。其实说白了就是文件，可能是文本文件，word或者pdf等
				Document doc = new Document();
				// Field就是每个文档中包含的不同的域
				Field field = new Field("fieldName", text,
						TextField.TYPE_STORED);
				doc.add(field);
				writer.addDocument(doc);
			}

		} catch (IOException e) {
			LOGGER.error(e.getMessage(), e);
		} finally {
			if (writer != null) {
				try {
					writer.close();
				} catch (IOException e) {
					LOGGER.error(e.getMessage(), e);
				}
			}
		}

		DirectoryReader reader = null;
		try {
			try {

				reader = DirectoryReader.open(directory);
				// IndexSearcher是对前边IndexWriter创建的索引进行搜索
				IndexSearcher searcher = new IndexSearcher(reader);

				// Query就是Lucene给我们的查询接口，它有很多的子类，我们可以基于这些进行功能丰富的查询
				// TermQuery是Lucene提供的最基本的查询类型
				// Term对象是搜索功能的基本单元，跟Field对象非常类似，可以放入我们查询的条件
				Query query = new TermQuery(new Term("fieldName", "foreach"));

				// TopDocs类是一个简单的指针容器，指针一般指向前N个排名的搜索结果，搜索结果即匹配查询条件的文档
				TopDocs hits = searcher.search(query, 10);

				for (ScoreDoc scoreDoc : hits.scoreDocs) {
					Document hitDoc = searcher.doc(scoreDoc.doc);
					System.out.println(hitDoc.get("fieldName"));
				}

			} catch (IOException e) {
				LOGGER.error(e.getMessage(), e);
			} finally {
				if (reader != null) {
					try {
						reader.close();
					} catch (IOException e) {
						LOGGER.error(e.getMessage(), e);
					}
				}
			}

		} finally {
			try {
				directory.close();
			} catch (IOException e) {
				LOGGER.error(e.getMessage(), e);
			}
		}
	}
}